package remote

import (
	"errors"
	"fmt"
	"io"
	"os"
	"sort"
	"strings"

	"gitee.com/dark.H/go-remote-repl/datas"
	"gitee.com/dark.H/go-remote-repl/lpc"
)

func (m *ApiServerMan) SessionHandler() {
	names := lpc.SessionLsName()
	sort.Strings(names)
	names = append([]string{
		"1. Create Session Task:",
		// "2. Manager exists session:",
	}, names...)

	choose, err := m.Choose("rpc:", names...)
	if err != nil {
		datas.JsonErr(err, m.con)
		return
	}

	switch choose {
	case "1. Create Session Task:":
		m.FunctionDo()
	// case "2. Manager exists session:":
	// 	sessionId, err := m.Choose("session list:", func() (o []string) {
	// 		for _, id := range lpc.SessionLs() {
	// 			if ss := lpc.SessionQuery(id); ss != nil {
	// 				o = append(o, id+" ("+ss.State+")")
	// 			}
	// 		}
	// 		return
	// 	}()...)
	// 	if err != nil {
	// 		datas.JsonErr(err, m.con)
	// 		return
	// 	}
	// 	oper, err := m.Choose("Oper?", "1. log", "2. kill", "3. download log", "4. remove")
	// 	if err != nil {
	// 		datas.JsonErr(err, m.con)
	// 		return
	// 	}
	// 	if sess := lpc.SessionQuery(strings.Fields(sessionId)[0]); sess != nil {
	// 		switch oper {
	// 		case "1. log":
	// 			m.SendMsg(datas.Green("State : " + sess.State))
	// 			sess.OutputPipe(m.con)
	// 		case "2. kill":
	// 			buf, err := sess.KillMySelf()
	// 			if err == nil {
	// 				m.SendMsg(string(buf))
	// 			} else {
	// 				m.SendMsg(err.Error())
	// 			}
	// 			m.con.Close()
	// 		case "3. download log":
	// 			f, err := os.Open(sess.OutputLog)
	// 			if err != nil {
	// 				m.SendMsg(err.Error())
	// 				m.con.Close()
	// 				return
	// 			}
	// 			defer f.Close()
	// 			defer m.con.Close()
	// 			fi, _ := f.Stat()
	// 			len := fi.Size()
	// 			name := fmt.Sprintf("%d:%s", len, sess.Id)
	// 			datas.FunctionJson(m.con, "download", datas.G{name: ""})
	// 			// defer fp.Close()
	// 			// reader := bufio.NewReader(f)
	// 			// for {
	// 			// 	line, err := reader.ReadString('\n')
	// 			// 	switch err {
	// 			// 	case io.EOF:
	// 			// 		break
	// 			// 	default:
	// 			// 		m.con.Write([]byte(line))
	// 			// 	}
	// 			// }
	// 			fmt.Println("ready ==> con")
	// 			io.Copy(m.con, f)

	// 			return
	// 		case "4. remove":
	// 			sess.Remove()
	// 			m.con.Close()
	// 		}
	// 	} else {
	// 		datas.JsonErr(errors.New("Not found session by query:"+strings.Fields(sessionId)[0]), m.con)
	// 	}

	default:
		if q := strings.Fields(choose); len(q) > 0 {
			if sess := lpc.SessionQuery(q[0]); sess != nil {
				oper, err := m.Choose("Oper?", "1. log", "2. kill", "3. download log", "4. remove")
				if err != nil {
					datas.JsonErr(err, m.con)
					return
				}
				switch oper {
				case "1. log":
					m.SendMsg(datas.Green("State : " + sess.State))
					sess.OutputPipe(m.con)
				case "2. kill":
					buf, err := sess.KillMySelf()
					if err == nil {
						m.SendMsg(string(buf))
					} else {
						m.SendMsg(err.Error())
					}
					m.con.Close()
				case "3. download log":
					f, err := os.Open(sess.OutputLog)
					if err != nil {
						m.SendMsg(err.Error())
						m.con.Close()
						return
					}
					defer f.Close()
					defer m.con.Close()
					fi, _ := f.Stat()
					len := fi.Size()
					name := fmt.Sprintf("%d:%s", len, sess.Id)
					datas.FunctionJson(m.con, "download", datas.G{name: ""})
					// defer fp.Close()
					// reader := bufio.NewReader(f)
					// for {
					// 	line, err := reader.ReadString('\n')
					// 	switch err {
					// 	case io.EOF:
					// 		break
					// 	default:
					// 		m.con.Write([]byte(line))
					// 	}
					// }
					fmt.Println("ready ==> con")
					io.Copy(m.con, f)

					return
				case "4. remove":
					sess.Remove()
					m.con.Close()
				}
			} else {
				datas.JsonErr(errors.New("Not found session by query:"+q[0]), m.con)
			}
		}
	}
}
